package v1ch7.FontTest;

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.font.FontRenderContext;
import java.awt.geom.Line2D;
import java.awt.geom.Rectangle2D;

import javax.swing.JComponent;
import javax.swing.JFrame;

public class FontTest {
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {

			public void run() {
				FontFrame frame = new FontFrame();
				frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				frame.setVisible(true);
			}
		});
	}
}

@SuppressWarnings("serial")
class FontFrame extends JFrame {

	public FontFrame() {
		setTitle("FontTest");
		setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
		FontComponent component = new FontComponent();
		add(component);
	}

	private static final int DEFAULT_WIDTH = 300;
	private static final int DEFAULT_HEIGHT = 200;
}

@SuppressWarnings("serial")
class FontComponent extends JComponent {
	public void paintComponent(Graphics g) {
		Graphics2D g2 = (Graphics2D) g;

		String message = "Hello, World!";

		Font f = new Font("Serif", Font.BOLD, 36);
		g2.setFont(f);

		FontRenderContext context = g2.getFontRenderContext();
		Rectangle2D bounds = f.getStringBounds(message, context);

		double x = (getWidth() - bounds.getWidth()) / 2;
		double y = (getHeight() - bounds.getHeight()) / 2;

		double ascent = -bounds.getY();
		double baseY = y + ascent;

		g2.drawString(message, (int) x, (int) baseY);

		g2.setPaint(Color.LIGHT_GRAY);

		g2.draw(new Line2D.Double(x, baseY, x + bounds.getWidth(), baseY));

		Rectangle2D rect = new Rectangle2D.Double(x, y, bounds.getWidth(),
				bounds.getHeight());
		g2.draw(rect);
	}
}